#!/usr/bin/env python
# -*- coding: utf-8 -*-

# This file is part of PyDownTV.
#
#    PyDownTV is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    PyDownTV is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with PyDownTV.  If not, see <http://www.gnu.org/licenses/>.

# Archivo MAIN (principal) del proyecto PyDownTV:

__author__ = "aabilio"
__date__ = "$29-mar-2011 11:01:48$"
__version__ = "6.0-BETA"

from sys import argv, exit, platform
from optparse import OptionParser
import re


#from ui.gui import Ui_MainWindow

# Ir añadiendo según se implementen
from Servers.a3 import A3
from Servers.tve import TVE
from Servers.rtve import RTVE
# DEPRECATED from Servers.tvalacarta import TvAlacarta
from Servers.telecinco import Telecinco
from Servers.divinity import Divinity
from Servers.mitele import MiTele
from Servers.lasexta import LaSexta
from Servers.cuatro import Cuatro
from Servers.crtvg import CRTVG
from Servers.btv import BTV
from Servers.canalsur import CSur
from Servers.rtvv import RTVV
from Servers.tv3 import TV3
from Servers.eitb import EITB
from Servers.extremadura import ETV
from Servers.televigo import TeleVigo
from Servers.tvamurcia import TVAmurcia
from Servers.intereconomia import Intereconomia
from Servers.giraldatv import GiraldaTV
from Servers.riasbaixas import RiasBaixas
from Servers.rtvcyl import RTVCYL
from Servers.rtvc import RTVC
from Servers.rtvcm import RTVCM
from Servers.planetaurbe import PlanetaUrbe
from Servers.aragontv import AragonTV
from Servers.telemadrid import TeleMadrid
from Servers.rtpa import RTPA
from Servers.mtv import MTV
from Servers.abc import ABC
from Servers.vcfplay import VCFPlay
from Servers.Descargar import Descargar

from Servers.utiles import salir, windows_end, PdtVersion, printt

class Servidor(object):
    '''
        Contiene los métodos para identificar a que servidor (tv) pertenece la url que
        introdujo el usuario.
    '''
    def __init__(self, url=None):
        '''Lo único a resaltar es que reibirá la URL'''
        self._url = url
    def isAntena3_(self):
        '''return True si la URL pertenece a antena 3'''
        if self._url.find("antena3.com") != -1:
            return True
    def isTVE_(self):
        '''return True si la URL pertenece a Televisión Española'''
        if self._url.find("rtve.es") != -1:
            return True
    #def isTVEaLaCarta_(self): # DEPRECATED
    #    if self._url.find("rtve.es") != -1 and self._url.find("/alacarta/") != -1:
    #        return True
    def isRTVE_(self):
        '''return True si la URL pertenece a los audios de a web de telvión española (Radio Nacional)'''
        if self._url.find("rtve.es") != -1 and \
            (self._url.find("/mediateca/audios/") != -1 or self._url.find("/alacarta/audios/") != -1):
            return True
    def isT5_(self):
        '''return True si la URL pertenece a Telecinco'''
        if self._url.find("telecinco.es") != -1:
            return True
    def isDivinity_(self):
        '''return True si la URL pertenece a Divinity'''
        if self._url.find("divinity.es") != -1:
            return True
    def miTele_(self):
        '''return True si la URL pertenece a Mi Tele'''
        if self._url.find("mitele.es") != -1:
            return True
    def isLaSexta_(self):
        '''return True si la URL pertenece a La Sexta'''
        if self._url.find("lasexta.com/") != -1 or self._url.find("lasextadeportes.com") != -1 \
            or self._url.find("lasextanoticias.com") != -1:
            return True
    def isCuatro_(self):
        '''return True si la URL pertenece a Cuatro'''
        if self._url.find("cuatro.com/") != -1:
            return True
    def isCRTVG_(self):
        '''return True is la URL pertenece a TV de Galiza'''
        if self._url.find("crtvg.es/") != -1:
            return True
    def isBTV_(self):
        '''return True si la URL pertenece a BTV'''
        if self._url.find("btvnoticies.cat") != -1 or self._url.find("btv.cat/alacarta") != -1:
            return True
    def isCSur_(self):
        '''return True si la URL pertenece a Canal Sur TV'''
        if self._url.find("canalsuralacarta.es") != -1 or self._url.find("canalsur.es") != -1:
            return True
    def isRTVV_(self):
        '''return True si la URL pertenece a Ràdio Televisió Valenciana'''
        if self._url.find("rtvv.es") != -1:
            return True
    def isTV3_(self):
        '''return True si la url perteneces a TV3'''
        if self._url.find("tv3.cat") != -1 or self._url.find("3cat24.cat") != -1 or self._url.find("catradio.cat") != -1 \
            or self._url.find("3xl.cat/") != -1 or self._url.find("324.cat") != -1:
            return True
    def isEITB_(self):
        '''return True si la url pertenece a EITB'''
        if self._url.find("eitb.com") != -1 or self._url.find("eitb.tv") != -1:
            return True
    def isETV_(self):
        '''return True si la url pertenece a extremadura TV'''
        if self._url.find("canalextremadura.es/") != -1:
            return True
    def isTeleVigo_(self):
        '''return True si la url pertenece a TeleVigo'''
        if self._url.find("televigo.com/") != -1:
            return True
    def isTVAmurcia_(self):
        '''return True si la url pertenece a la televisión autonómica de Murcia'''
        if self._url.find("7rm.es/") != -1:
            return True
    def isIntereconomia_(self):
        '''return True si la url pertenecea Intereconomia'''
        if self._url.find("intereconomia.com/") != -1:
            return True
    def isGiraldaTV_(self):
        '''return True si la url pertenece a Giralda TV'''
        if self._url.find("giraldatv.es/") != -1:
            return True
    def isCanalRiasBaixas_(self):
        '''return True si la url pertenece a Canal Rías Baixas'''
        if self._url.find("canalriasbaixas.com/") != -1:
            return True
    def isRTVCYL_(self):
        '''return True si la utl pertenecea Radio TV de Castilla y León'''
        if self._url.find("rtvcyl.es/") != -1:
            return True
    def isRTVC_(self):
        '''return True si la url pertenece a RTVC'''
        if self._url.find("rtvc.es/") != -1:
            return True
    def isRTVCM_(self):
        '''return True si la url pertenece a RTV de Castilla - La Mancha'''
        if self._url.find("rtvcm.es/") != -1:
            return True
    def isPlanetaUrbe_(self):
        '''return True si la url pertenece a PlanetaUrbe.tv'''
        if self._url.find("planetaurbe.tv/") != -1:
            return True
    def isAragonTV_(self):
        '''return True si la url pertenece a Aragón TV'''
        if self._url.find("aragontelevision.es/") != -1:
            return True
    def isTeleMadrid_(self):
        '''return True si la url pertenece a Tele Madrid'''
        if self._url.find("telemadrid.es/") != -1:
            return True
    def isRTPA_(self):
        '''return True si la url pertenece a RTPA'''
        if self._url.find("rtpa.es/") != -1:
            return True
    def isMTV_(self):
        '''return True si la url pertenece a MTV'''
        if self._url.find("mtv.es/") != -1 or self._url.find("mtvla.com/") != -1:
            return True
    def isABC_(self):
        '''return True si la url pertenece a ABC'''
        if self._url.find("abc.es/") != -1:
            return True
    def isVCFPlay_(self):
        '''return True si la url pertenece a VCFPlay'''
        if self._url.find("vcfplay.com") != -1:
            return True
    
    # COMPLEMENTAR CON LOS DIFERENTES SERVIDORES QUE SE VAYAN SOPORTANDO
    
    isAntena3 = property(isAntena3_)
    isTVE = property(isTVE_)
    # DEPRECATED isTVEaLaCarta = property(isTVEaLaCarta_)
    isRTVE = property(isRTVE_)
    isT5 = property(isT5_)
    isDivinity = property(isDivinity_)
    isMiTele = property(miTele_)
    isLaSexta = property(isLaSexta_)
    isCuatro = property(isCuatro_)
    isCRTVG = property(isCRTVG_)
    isBTV = property(isBTV_)
    isCSur = property(isCSur_)
    isRTVV = property(isRTVV_)
    isTV3 = property(isTV3_)
    isEITB = property(isEITB_)
    isETV = property(isETV_)
    isTeleVigo = property(isTeleVigo_)
    isTVAmurcia = property(isTVAmurcia_)
    isIntereconomia = property(isIntereconomia_)
    isGiraldaTV = property(isGiraldaTV_)
    isCanalRiasBaixas = property(isCanalRiasBaixas_)
    isRTVCYL = property(isRTVCYL_)
    isRTVC = property(isRTVC_)
    isRTVCM = property(isRTVCM_)
    isPlanetaUrbe = property(isPlanetaUrbe_)
    isAragonTV = property(isAragonTV_)
    isTeleMadrid = property(isTeleMadrid_)
    isRTPA = property(isRTPA_)
    isMTV = property(isMTV_)
    isABC = property(isABC_)
    isVCFPlay = property(isVCFPlay_)
    
def qServidor(url):
    '''
        Comprueba utlizando la clase Servidor de que servicio ha recibido la url
        y devuelve el objeto según el servicio que del cual se haya pasado la
        url
    '''
    # Descomentar return según se vañan añadiendo
    server = Servidor(url)
    if server.isAntena3:
        printt(u"[INFO] Antena 3 Televisión")
        return A3(url)
    #elif server.isTVEaLaCarta: # DEPRECATED
    #    print "[INFO] TV Española \"A la carta\""
    #    return TvAlacarta(url)
    elif server.isRTVE: # Tienes que comprobarse antes que isTVE
        printt(u"[INFO] Audio de RTVE.es")
        return RTVE(url)
    elif server.isTVE:
        printt(u"[INFO] Vídeo de RTVE.es")
        return TVE(url)
    elif server.isT5:
        printt(u"[INFO] Telecinco")
        return Telecinco(url)
    elif server.isDivinity:
        printt(u"[INFO] Divinity")
        return Divinity(url)
    elif server.isMiTele:
        printt(u"[INFO] Mi Tele")
        return MiTele(url)
    elif server.isLaSexta:
        printt(u"[INFO] La Sexta")
        return A3(url)
    elif server.isCuatro:
        printt(u"[INFO] Cuatro")
        #printt(u"[!!!] Actualmente algunos vídeos de Cuatro dan ERROR")
        return Cuatro(url)
    elif server.isCRTVG:
        printt(u"[INFO] Televisión de Galiza")
        return CRTVG(url)
    elif server.isBTV:
        printt(u"[INFO] Barcelona Televisió")
        return BTV(url)
    elif server.isCSur:
        printt(u"[INFO] Canal Sur")
        return CSur(url)
    elif server.isRTVV:
        printt(u"[INFO] Ràdio Televisió Valenciana")
        return RTVV(url)
    elif server.isTV3:
        printt(u"[INFO] TV3")
        return TV3(url)
    elif server.isEITB:
        printt(u"[INFO] EITB")
        return EITB(url)
    elif server.isETV:
        printt(u"[INFO] Radio Televisión de Extremadura")
        return ETV(url)
    elif server.isTeleVigo:
        printt(u"[INFO] Tele Vigo")
        return TeleVigo(url)
    elif server.isTVAmurcia:
        printt(u"[INFO] TV Autonómica de Murcia")
        return TVAmurcia(url)
    elif server.isIntereconomia:
        printt(u"[INFO] Intereconomía")
        return Intereconomia(url)
    elif server.isGiraldaTV:
        printt(u"[INFO] Giralda Televisión")
        return GiraldaTV(url)
    elif server.isCanalRiasBaixas:
        printt(u"[INFO] canalriasbaixas.com")
        return RiasBaixas(url)
    elif server.isRTVCYL:
        printt(u"[INFO] Radio Televisión de Castilla y León")
        return RTVCYL(url)
    elif server.isRTVC:
        printt(u"[INFO] Radio Televisión Canaria")
        return RTVC(url)
    elif server.isRTVCM:
        printt(u"[INFO] Radio Televisión de Castilla - La Mancha")
        return RTVCM(url)
    elif server.isPlanetaUrbe:
        printt(u"[INFO] Planeta Urbe TV")
        return PlanetaUrbe(url)
    elif server.isAragonTV:
        printt("[INFO] Aragón TV [A la Carta]")
        return AragonTV(url)
    elif server.isTeleMadrid:
        printt(u"[INFO] Tele Madrid")
        return TeleMadrid(url)
    elif server.isRTPA:
        printt(u"[INFO] RTPA")
        return RTPA(url)
    elif server.isMTV:
        printt(u"[INFO] MTV")
        return MTV(url)
    elif server.isABC:
        printt(u"[INFO] ABC")
        return ABC(url)
    elif server.isVCFPlay:
        printt(u"[INFO] Valencia CF Play")
        return VCFPlay(url)
    else:
        #msgErr = u"ERROR: La URL \"" + url + u"\" no pertenece a ninguna Televisión soportada"
        return None
        
def argsparse():
    rVersion = PdtVersion().PDT_VERSION_WIN if platform == "win32" else PdtVersion().PDT_VERSION_NIX
    parser = OptionParser(usage="%prog [-n --no-check-version] [-s --show] <\"url1\" \"url2\" ...>", 
                          version="PyDownTV "+rVersion)
    parser.add_option("-n", "--no-check-version", dest="check_version", action="store_true", 
                      help="No comprobar si existen actualizaciones")
    parser.add_option("-s", "--show", dest="show", action="store_true", 
                      help="Solo mostrar los enlaces de descarga (no descargar)")
    return parser.parse_args()
        
def comprobar_version():
    '''
        Comprueba la versión del cliente con la última lanzada utilizando la clase
        PdtVersion() de utilies.py
    '''
    printt(u"[INFO VERSIÓN] Comprobando si existen nuevas versiones de PyDownTV")
    pdtv = PdtVersion()
    try:
        new_version, changelog = pdtv.get_new_version()
        if new_version == -1:
            printt(u"[!!!] ERROR al comprobar la versión del cliente")
        else:
            pdtv.comp_version(new_version, changelog)
    except KeyboardInterrupt:
        printt(u"[+] Comprobación cancelada")
    except Exception:
        printt(u"[!!!] ERROR al comprobar la versión del cliente")

    
def isURL(url):
    '''
        Compara de forma muy básica si la cadena que se le pasa como parámetro es una URL válida
    '''
    p = re.compile(
    '^(https?)://([-a-z0-9\.]+)(?:(/[^\s]+)(?:\?((?:\w+=[-a-z0-9/%:,._]+)?(?:&\w+=[-a-zA-Z0-9/%:,._]+)*)?)?)?$', 
    re.IGNORECASE)
    m = p.match(url)
    return True if m else False



if __name__ == "__main__":
    (options, urls) = argsparse()
    
    if not urls: printt(u"PyDownTV (Descarga vídeos de las webs de TV españolas):\n--------\n")
    if not options.check_version: comprobar_version()
        
    if not urls:
        printt(u"[--->] Introduce las URL de los vídeos (separadas por espacios):")
        inPut = raw_input()
        urls = inPut.split(" ")
    
    vUrls = [url for url in urls if isURL(url)]
    iUrls = [url for url in urls if not isURL(url)]
    
    if iUrls:
        printt(u"[!!!] Las siguientes urls no son válidas:")
        for url in iUrls: printt(u"-> %s" % url)
        printt()
    
    if not vUrls:
        salir(u"[!!!] Ninguna url válida")
    else:
        for url in vUrls:
            printt(u"\n[ URL ] %s" % url)
            servidor = qServidor(url)
            if not servidor:
                printt(u"ERROR: La URL \"%s\" no pertenece a ninguna Televisión soportada" % url)
                continue
            #Chapucilla
            out = servidor.procesarDescarga()
            urlDeDescarga, outputName = out[:2]
            if len(out) > 2: otros = out[2:]
            else: otros = None
            
            if options.show:
                if type(urlDeDescarga) is list:
                    for i in urlDeDescarga: printt(u"[URL DESCARGA] %s" % i)
                else: printt(u"[URL DESCARGA] %s" % urlDeDescarga)
            else:
                D = Descargar(urlDeDescarga)
                D.outputName = outputName
                D.otros = otros #Chapucilla
                D.descargarVideo()
                printt(u"")
    windows_end()
